﻿using System;
using System.Collections.Generic;
using System.Linq;
using VO;

namespace DAL
{
    public class FilaDAL
    {
        //public int idFila { get; set; }
        //public int idCliente { get; set; }
        //public int idAtendente { get; set; }
        //public int idCampanha { get; set; }
        //public int idPrioridadeFila { get; set; }
        //public int idStatus { get; set; }
        //public DateTime dtInicioAtendimento { get; set; }
        //public DateTime dtFinalAtendimento { get; set; }
        //public DateTime? dtAgendamento { get; set; }

        /// <summary>
        /// Valida as ações (insert,delete,update) da classe Fila
        /// </summary>
        /// <param name="fila">objeto deve conter um idCliente, idAtendente e idCampanha</param>
        /// <returns></returns>
        public bool ValidaFila(Fila fila)
        {
            var retorno = true;

            if (fila.idCliente == 0 ||
                fila.idAtendente == 0 ||
                fila.idCampanha == 0)
            {
                retorno = false;
            }

            return retorno;
        }

        /// <summary>
        /// Retorna cliente vinculado para um atendente
        /// </summary>
        /// <param name="obFila"></param>
        /// <returns></returns>
        public List<Fila> SelectFilaOperador(Fila obFila)
        {
            List<Fila> listaFila = null;

            using (CallcenterEntities data = new CallcenterEntities())
            {
                var consulta = (from tb in data.tbCCFila
                                join tbcc in data.CCCliente_Callcenter on tb.idCliente equals tbcc.idCliente
                                where tb.idAtendente == obFila.idAtendente && 
                                      tb.dtFinalAtendimento==null
                                      && tbcc.fgAtivo
                                      && !(from tb2 in data.tbCCBlackList
                                               select tb2.cpf).Contains(tbcc.CPF)
                                select tb).ToList().FirstOrDefault();

                if (consulta != null)
                {
                    listaFila = new List<Fila>();
                    var fila = new Fila();

                    fila.idFila = consulta.idFila;
                    fila.idCliente = consulta.idCliente;
                    fila.idAtendente = consulta.idAtendente;
                    fila.idCampanha = consulta.idCampanha;
                    fila.idPrioridadeFila = consulta.idPrioridadeFila;
                    fila.idStatus = consulta.idStatus;
                    fila.dtInicioAtendimento = consulta.dtInicioAtendimento;
                    fila.dtFinalAtendimento = consulta.dtFinalAtendimento;
                    fila.TipoSorteio = COMMON.Enumerator.TipoSorteio.Vinculado;

                    listaFila.Add(fila);
                }
            }
            return listaFila;
        }


        public Fila SelectClienteFila(Fila obFila)
        {
            Fila objlistaFila = null;

            using (CallcenterEntities data = new CallcenterEntities())
            {
                var consulta = (from tb in data.tbCCFila
                                join tbcc in data.CCCliente_Callcenter on tb.idCliente equals tbcc.idCliente
                                where tb.idCliente == obFila.idCliente
                                      && tb.idCampanha==obFila.idCampanha
                                select tb).ToList().FirstOrDefault();

                if (consulta != null)
                {
                    objlistaFila.idFila = consulta.idFila;
                    objlistaFila.idCliente = consulta.idCliente;
                    objlistaFila.idAtendente = consulta.idAtendente;
                    objlistaFila.idCampanha = consulta.idCampanha;
                    objlistaFila.idPrioridadeFila = consulta.idPrioridadeFila;
                    objlistaFila.idStatus = consulta.idStatus;
                    objlistaFila.dtInicioAtendimento = consulta.dtInicioAtendimento;
                    objlistaFila.dtFinalAtendimento = consulta.dtFinalAtendimento;
                    objlistaFila.TipoSorteio = COMMON.Enumerator.TipoSorteio.Vinculado;
                }
            }
            return objlistaFila;
        }


        /// <summary>
        /// Retorna fila com agendamento para um atendente
        /// </summary>
        /// <param name="obFila"></param>
        /// <returns></returns>
        public List<Fila> SelectFilaCampanhaOperador(Fila obFila)
        {
            List<Fila> listaFila = null;

            using (var data = new CallcenterEntities())
            {
                var consulta = (from tb in data.tbCCFila
                                join tbAgenda in data.tbCCClienteAgendamento on tb.idCliente equals tbAgenda.idCliente
                                join tbcc in data.CCCliente_Callcenter on tb.idCliente equals tbcc.idCliente
                                where tb.idAtendente == obFila.idAtendente && tbAgenda.dataAgendamento <= DateTime.Now
                                && !(from tb2 in data.tbCCBlackList
                                     select tb2.cpf).Contains(tbcc.CPF)
                                orderby tb.dtInicioAtendimento ascending
                                select tb).ToList().FirstOrDefault();

                if (consulta != null)
                {
                    listaFila = new List<Fila>();
                    var fila = new Fila
                                   {
                                       idFila = consulta.idFila,
                                       idCliente = consulta.idCliente,
                                       idAtendente = consulta.idAtendente,
                                       idCampanha = consulta.idCampanha,
                                       idPrioridadeFila = consulta.idPrioridadeFila,
                                       idStatus = consulta.idStatus,
                                       dtInicioAtendimento = consulta.dtInicioAtendimento,
                                       dtFinalAtendimento = consulta.dtFinalAtendimento,
                                       TipoSorteio = COMMON.Enumerator.TipoSorteio.Agendado
                                   };

                    listaFila.Add(fila);
                }
            }
            return listaFila;
        }

        /// <summary>
        /// Insere um Cliente na tbCCfila para um atendente e retorna o idFila
        /// </summary>
        /// <param name="fila">Objeto do tipo Fila</param>
        /// <returns></returns>
        public int InsereFila(Fila fila)
        {
            using (CallcenterEntities data = new CallcenterEntities())
            {
                var tb = new tbCCFila();

                //tb.idFila = fila.idFila;
                tb.idCliente = fila.idCliente;
                tb.idAtendente = fila.idAtendente;
                tb.idCampanha = fila.idCampanha;
                tb.idPrioridadeFila = fila.idPrioridadeFila;
                tb.idStatus = fila.idStatus;
                tb.dtInicioAtendimento = fila.dtInicioAtendimento;
                tb.dtFinalAtendimento = fila.dtFinalAtendimento;

                data.AddTotbCCFila(tb);
                data.SaveChanges();

                return tb.idFila;
            }
        }

        /// <summary>
        /// Desvincula um Cliente da tabela fila, removendo o registro da mesma
        /// </summary>
        /// <param name="fila">Objeto do tipo Fila</param>
        /// <returns></returns>
        public void RemoveFila(Fila fila)
        {
            using (CallcenterEntities data = new CallcenterEntities())
            {
                var consulta = (from tb in data.tbCCFila
                                where tb.idFila == fila.idFila
                                select tb).First();

                data.tbCCFila.DeleteObject(consulta);
                data.SaveChanges();
            }
        }

        public void AgendaClienteFila(int idFila)
        {
            using (var data = new CallcenterEntities())
            {

                var consulta = (from tbF in data.tbCCFila
                                where tbF.idFila == idFila
                                select tbF).First();

                consulta.dtFinalAtendimento = DateTime.Now;
                data.SaveChanges();
            }
        }

        public IList<Fila> VinculaClienteAgendado(int idFila)
        {
            using (var data = new CallcenterEntities())
            {
                var list = new List<Fila>();
                var consulta = (from tbF in data.tbCCFila
                                where tbF.idFila == idFila
                                select tbF).First();

                consulta.dtInicioAtendimento = DateTime.Now;
                data.SaveChanges();
                list.Add(new Fila { dtInicioAtendimento = consulta.dtInicioAtendimento });
                return list;
            }
        }

    }
}
